from abc import ABC, abstractmethod
from typing import Any, Dict
from common.llm_client import llm_client
from common.prompt import prompt
class AlgoBase(ABC):
    """算法基类,所有算法都需要继承这个类"""
    
    def __init__(self):
        """初始化算法基类"""
        self.config: Dict[str, Any] = {}
        
    def config_init(self) -> None:
        """初始化配置
        
        所有算法都需要实现这个方法来初始化自己的配置
        """
        self.llm_client = llm_client
        self.prompt = prompt
        for prompt_name in self.prompts_name:
            setattr(self, prompt_name, prompt.get_prompt(prompt_name))
            

    @abstractmethod
    def execute(self, *args, **kwargs) -> Any:
        """执行算法
        
        所有算法都需要实现这个方法来执行具体的算法逻辑
        
        Args:
            *args: 位置参数
            **kwargs: 关键字参数
            
        Returns:
            Any: 算法执行结果
        """
        pass
        
    def run(self, *args, **kwargs) -> Any:
        """运行算法
        
        这个方法会依次执行config_init和execute方法
        
        Args:
            *args: 位置参数
            **kwargs: 关键字参数
            
        Returns:
            Any: 算法执行结果
        """
        self.config_init()
        return self.execute(*args, **kwargs)
    
    def input_segment(self, text: str, max_input_tokens: int) -> list:
        """将长文本按token数量分割成多个子文本
        
        Args:
            text: 待分割的文本
            max_input_tokens: 单个子文本最大token数
            
        Returns:
            list: 分割后的文本列表
        """
        if self.llm_client.llm.get_context_token(text) <= max_input_tokens:
            return [text]
        
        segments = []
        mid = len(text) // 2
        segments.extend(self.input_segment(text[:mid], max_input_tokens))
        segments.extend(self.input_segment(text[mid:], max_input_tokens))
        return segments
